package org.asiainfo.system.service;

import org.asiainfo.common.mybatis.stream.core.page.TableDataInfo;
import org.asiainfo.common.mybatis.stream.core.page.PageQuery;

import java.util.Collection;
import java.util.List;

import org.asiainfo.system.api.model.LoginUser;
import org.asiainfo.system.domain.vo.SysUserInfoVo;
import org.asiainfo.system.domain.vo.SysUserVo;
import org.asiainfo.system.domain.bo.SysUserBo;
import org.asiainfo.system.domain.SysUser;
import com.mybatisflex.core.service.IService;

/**
 * 用户信息表Service接口
 *
 * @author dotor-ww
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 通过userId查询单条数据
     *
     * @param userId 主键
     * @return 实例对象
     */
    SysUserVo queryById(Long userId);

    /**
     * 查询
     *
     * @param sysUserBo 筛选条件
     * @return 查询结果
     */
    List<SysUserVo> queryList(SysUserBo sysUserBo);

    /**
     * 分页查询
     *
     * @param sysUserBo 筛选条件
     * @param pageQuery 分页对象
     * @return 查询结果
     */
    TableDataInfo<SysUserVo> queryPageList(SysUserBo sysUserBo, PageQuery pageQuery);

    /**
     * 新增数据
     *
     * @param sysUserBo 实例对象
     * @return 实例对象
     */
    Boolean insertByBo(SysUserBo sysUserBo);

    /**
     * 修改数据
     *
     * @param sysUserBo 实例对象
     */
    Boolean updateByBo(SysUserBo sysUserBo);

    /**
     * 通过主键删除数据
     *
     * @param userIds 主键
     */
    Boolean deleteWithValidByIds(Collection<Long> userIds);

    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @return 结果
     */
    LoginUser getUserInfo(String username);

    /**
     * 通过用户ID查询用户信息
     *
     * @param userId   用户ID
     * @param tenantId 租户id
     * @return 结果
     */
    LoginUser getUserInfo(Long userId, Long tenantId);

    /**
     * 校验用户是否允许操作
     *
     * @param userId 用户ID
     */
    void checkUserAllowed(Long userId);

    /**
     * 校验用户数据权限
     *
     * @param userId 用户ID
     */
    void checkUserDateScope(Long userId);

    /**
     * 更新用户状态
     *
     * @param sysUserBo 用户信息
     * @return 操作结果
     */
    Boolean updateUserStatus(SysUserBo sysUserBo);

    /**
     * 通过用户ID查询单条数据
     *
     * @param userId 用户ID
     * @return 查询结果
     */
    SysUserVo selectUserId(Long userId);

    /**
     * 通过用户ID查询用户信息
     *
     * @param userId 用户ID
     * @return 查询结果
     */
    SysUserInfoVo selectUserInfoByUserId(Long userId);

    /**
     * 校验用户名称是否唯一
     *
     * @param sysUserBo 用户信息
     * @return 校验结果
     */
    Boolean checkUserNameUnique(SysUserBo sysUserBo);

    /**
     * 校验手机号是否唯一
     *
     * @param sysUserBo 用户信息
     * @return 校验结果
     */
    Boolean checkPhoneUnique(SysUserBo sysUserBo);

    /**
     * 校验邮箱是否唯一
     *
     * @param sysUserBo 用户信息
     * @return 校验结果
     */
    Boolean checkEmailUnique(SysUserBo sysUserBo);

    /**
     * 根据用户ID批量获取用户信息
     *
     * @param userIds 用户ID组
     * @param deptId  部门ID
     * @return 查询结果
     */
    List<SysUserVo> selectUserByIds(Long[] userIds, Long deptId);

    /**
     * 重置用户密码
     *
     * @param userId 用户ID
     * @param pwd    密码
     * @return 操作结果
     */
    Boolean resetUserPwd(Long userId, String pwd);

    /**
     * 用户授权橘色
     *
     * @param userId  用户ID
     * @param roleIds 角色组
     */
    void insertUserAuth(Long userId, Long[] roleIds);

    /**
     * 获取部门下的所有用户信息
     *
     * @param deptId 部门ID
     * @return 结果
     */
    List<SysUserVo> selectUserListByDeptId(Long deptId);

    /**
     * 通过用户名查询用户昵称
     *
     * @param userId 用户ID
     * @return 用户昵称
     */
    String getNickNameByUserId(Long userId);

    /**
     * 通过用户ID查询用户名
     *
     * @param userId 用户ID
     * @return 用户名
     */
    String getUserNameByUserId(Long userId);

    /**
     * 更新最后一次登陆的租户ID
     *
     * @param tenantId 租户ID
     */
    void updateUseLastTenantIdByUserId(Long tenantId);

    /**
     * 通过用户ID列表查询用户昵称列表
     *
     * @param userIds 用户ID列表
     * @return 用户昵称列表
     */
    List<String> selectNickNameByUserIdList(List<Long> userIds);
}
